#pragma once
// 数据库连接池
#include <string>
#include <queue>
#include <memory>
#include <mutex>
#include <condition_variable>
#include <thread>
#include "DbConnection.hpp"
namespace http
{
    namespace db
    {
        class DbConnectionPool
        {
        public:
            // 单例模式
            static DbConnectionPool &getInstance()
            {
                static DbConnectionPool instance;
                return instance;
            }

            // 初始化连接池
            void initialize(const std::string &host, const std::string &user, const std::string &password, const std::string &database, size_t poolSize = 10);
            // 获取连接
            std::shared_ptr<DbConnection> getConnection();

        private:
            DbConnectionPool();
            ~DbConnectionPool();

            DbConnectionPool(const DbConnectionPool &) = delete;            // 禁止拷贝构造
            DbConnectionPool &operator=(const DbConnectionPool &) = delete; // 禁止赋值

            std::shared_ptr<DbConnection> createConnection();              // 创建连接
            void checkConnection();                                      // 检查连接                    

        private:
            std::string _host;                                          // 数据库主机
            std::string _user;                                          // 数据库用户
            std::string _password;                                      // 数据库密码
            std::string _database;                                      // 数据库名称
            std::queue<std::shared_ptr<DbConnection>> _connectionQueue; // 连接队列
            std::mutex _mutex;                                          // 互斥锁
            std::condition_variable _cv;                                // 条件变量
            bool _initialized = false;                                  // 初始化标志
            std::thread _checkThread;                                   // 检查线程
        };
    }
}